package com.operator.Activitys.activity;

import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.view.Gravity;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;

import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.google.gson.Gson;
import com.jaredrummler.materialspinner.MaterialSpinner;
import com.operator.Activitys.R;
import com.operator.Activitys.activity.base.BaseActivity;
import com.operator.Activitys.bean.Iccid;
import com.operator.Activitys.bean.OrderPayState;
import com.operator.Activitys.bean.OrderState;
import com.operator.Activitys.bean.State;
import com.operator.Activitys.bean.User;
import com.operator.Activitys.dialog.PopEnterPassword;
import com.operator.Activitys.http.manager.HomeManager;
import com.operator.Activitys.http.manager.UserManager;
import com.operator.Activitys.listener.OnDoubleClickListener;
import com.operator.Activitys.utils.Constant;
import com.operator.Activitys.utils.JumperUtils;
import com.operator.Activitys.utils.ToastUtils;
import com.zhy.autolayout.AutoRelativeLayout;

import org.simple.eventbus.EventBus;
import org.simple.eventbus.Subscriber;
import org.simple.eventbus.ThreadMode;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import butterknife.Bind;
import butterknife.OnClick;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

/**
 * 项目名称：金泽云 手机app
 * 类描述：电信、移动卡 Activity
 * 创建人：张飞祥
 * 创建时间：2018/5/3 15:31
 * 修改人：张飞祥
 * 修改时间：2018/5/3 15:31
 * 修改备注：
 */
public class TelecomCardActivity extends BaseActivity {

    /**
     * 布局
     */
    //返回按钮
    @Bind(R.id.iv_return)
    ImageView ivReturn;
    //标题
    @Bind(R.id.tv_title)
    TextView tvTitle;
    //文字功能按钮
    @Bind(R.id.tv_function)
    TextView tvFunction;
    //开卡卡号
    @Bind(R.id.tv_card_number)
    TextView tvCardNumber;
    //开卡类型
    @Bind(R.id.tv_card_type)
    TextView tvCardType;
    //iccid 选择
    @Bind(R.id.spinner_number_iccid)
    MaterialSpinner spinnerNumberIccid;
    //留言
    @Bind(R.id.et_card_info)
    EditText etCardInfo;
    //温馨提示 信息
    @Bind(R.id.tv_prompt)
    TextView tvPrompt;
    //价格总布局
    @Bind(R.id.layout_card_show_money)
    AutoRelativeLayout layoutCardShowMoney;
    //价格显示隐藏布局
    @Bind(R.id.layout_card_money)
    AutoRelativeLayout layoutCardMoney;
    //价格
    @Bind(R.id.tv_card_money)
    TextView tvCardMoney;

    /**
     * 变量
     */
    //订单 初始化网络请求
    public HomeManager mApiHomeManager;
    //支付 初始化网络请求
    public UserManager mApiUserManager;

    //TODO 当前用户信息
    private User mACacheUser = null;

    //TODO 传递 过来的 数据
    //获取传递 标记
    private int mTelecomTitleTag;
    //当前运营商
    private String mTelecomOperator = "";
    //获取传递 套餐 标题
    private String mSetMealTitle;
    //获取传递 手机号码
    private String mPhoneNumber;
    //获取传递 手机号码 价格
    private double mPrice = 0;

    //TODO 其他变量
    //价格双击 标记
    private boolean mMoneyFlag = true;
    //当前选择的 iccid
    private String mIccid = "";
    //获取内存中号卡提示信息
    private String mPrompt = "";

    //当前订单是否已经支付过了
    private boolean mOrderFlag = false;
    //支付 弹窗
    private PopEnterPassword mPopPayPwd = null;
    //订单返回结果
    private OrderState mOrderState = null;

    @Override
    protected void initUI() {
        setContentView(R.layout.act_telecom_card);
        //网络请求接口 常驻方法
        mApiHomeManager = mApiHomeManager.getHomeApiManager(this, this.getTaskId());
        //网络请求接口 常驻方法
        mApiUserManager = mApiUserManager.getUserApiManager(this, this.getTaskId());
        //设置状态栏为透明
        setThemeTransparent();

        //TODO 获取内存用户实体
        Gson gson = new Gson();
        mACacheUser = gson.fromJson(mACache.getAsJSONObject(Constant.CACHE_USER) + "", User.class);

        //TODO 获取内存中 宽带提示信息
        mPrompt = mACache.getAsString(Constant.CACHE_LOGIN_PHONE_ORDER_MSG);
        //设置温馨提示
        tvPrompt.setText(mPrompt);

        //TODO  获取传递过来的 Key
        Bundle bundle = this.getIntent().getExtras();
        if (bundle != null) {
            //电信、移动卡 tag
            mTelecomTitleTag = bundle.getInt(Constant.INTENT_SALE_TAG);
            //套餐标题
            mSetMealTitle = bundle.getString(Constant.INTENT_SALE_TITLE);
            //手机号码
            mPhoneNumber = bundle.getString(Constant.INTENT_SALE_PHONE_NUMBER);
            //手机号码 价格
            mPrice = bundle.getDouble(Constant.INTENT_SALE_PRICE);

            //设置 开卡卡号
            tvCardNumber.setText(mPhoneNumber);
            //设置 开卡类型
            tvCardType.setText(mSetMealTitle);
            //设置 号卡价格
            tvCardMoney.setText("￥" + mPrice + " 元");

            //TODO 设置标题
            if (mTelecomTitleTag == 1) {
                tvTitle.setText("电信卡");
                mTelecomOperator = "电信";
            } else {
                tvTitle.setText("移动卡");
                mTelecomOperator = "移动";
            }
        }
        //显示返回按钮
        ivReturn.setVisibility(View.VISIBLE);
        //显示文字功能按钮
        tvFunction.setVisibility(View.VISIBLE);
        //设置功能按钮 文字
        tvFunction.setText("获取验证码");
    }

    @Override
    protected void initData() {
        //TODO 双击 动态显示 价格
        initShowOrHideMoney();
        //TODO 开网络请求 获取 iccid
        mApiHomeManager.homeIccidList(mTelecomOperator, mACacheUser.getId(),mPhoneNumber);
    }

    /**
     * 双击 显示 或 隐藏 价格视图
     */
    private void initShowOrHideMoney() {
        //双击监听事件
        layoutCardShowMoney.setOnTouchListener(new OnDoubleClickListener(new OnDoubleClickListener.DoubleClickCallback() {
            @Override
            public void onDoubleClick() {
                if (mMoneyFlag) {
                    layoutCardMoney.setVisibility(View.VISIBLE);
                    mMoneyFlag = false;
                } else {
                    layoutCardMoney.setVisibility(View.INVISIBLE);
                    mMoneyFlag = true;
                }
            }
        }));
    }

    /**
     * 按钮点击事件
     *
     * @return
     */
    @OnClick({R.id.iv_return, R.id.tv_function, R.id.btn_card_submit})
    public void onClick(View view) {
        switch (view.getId()) {
            case R.id.iv_return:            //返回按钮
                finish();
                break;
            case R.id.tv_function:          //获取验证码
                setGainVCode();
                ToastUtils.showShort(this,"正在获取验证码，请耐心等待...");
                break;
            case R.id.btn_card_submit:      //确认按钮
                initHttpTelecomSubmit();
                break;
        }
    }

    /**
     * 获取验证码
     */
    private void setGainVCode() {

        /**
         * 创建 okHttp3 请求方式
         */
        FormBody.Builder params = new FormBody.Builder();
        OkHttpClient okHttpClient = new OkHttpClient();
        Request request = new Request.Builder()
                .url(Constant.HTTP_NUMBER_VCODE_URL+mACacheUser.getId()+"&Carrieroperator="+mTelecomOperator)
                .post(params.build())
                .build();
        Call call = okHttpClient.newCall(request);
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        ToastUtils.showShort(TelecomCardActivity.this,"发送失败，网络连接不稳定！");
                    }
                });
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        ToastUtils.showShort(TelecomCardActivity.this,"发送成功，稍后会接收到短信通知！");
                    }
                });
            }
        });
    }

    /**
     * 提交号码开卡信息
     */
    private void initHttpTelecomSubmit() {

        //留言
        String remark = etCardInfo.getText().toString();

        //当前用户余额
        double shopMoney = mACacheUser.getRemainder();

        /**
         * 判断 店铺 是否被冻结
         *
         * 未冻结：可以支付当前订单
         *
         *      判断 支付密钥是否为空
         *
         *          非空的： 则直接 开启支付
         *
         *                  判断 iccid是否为空
         *                       true： 弹出提示
         *                       false：进行网络请求
         *          是空的： 跳转 设置 支付密码
         *
         * 已冻结：不可以支付当前订单了
         *
         */

        //TODO 判断是否被冻结
        if (Constant.SHOP_STATE_YES.equals(mACacheUser.getState())) {
            //TODO 再次判断支付密码是否为空
            if (mACacheUser.getTsPwd() != null  && !mACacheUser.getTsPwd().equals("")) {
                if (mIccid.equals("")) {
                    ToastUtils.showShort(this, "当前号码还没有仅供选择的 “ICCID” ！");
                } else if (shopMoney < mPrice){
                    //弹出提示
                    ToastUtils.showShort(this, "余额不足，请充值！");
                    //跳转 充值页面
                    JumperUtils.JumpTo(TelecomCardActivity.this, RechargeActivity.class);
                } else if (mOrderFlag){
                    //弹出支付软件盘
                    setShowPayPopupView("号卡订单支付", mOrderState.getPrice());
                } else {
                    //显示进度弹窗
                    initShowTimeDialog("正在提交开卡办理订单，请稍后....", this);
                    //开始网络请求
                    mApiHomeManager.homeTelecomSubmit(mACacheUser.getId(),mSetMealTitle,mTelecomOperator,
                            mPhoneNumber,mIccid,"否",remark,mPrice);
                }
            }else {
                //弹出提示
                ToastUtils.showShort(TelecomCardActivity.this,"请先设置您的支付密码！");
                //跳转设置支付密码页面
                JumperUtils.JumpTo(TelecomCardActivity.this, PayManageActivity.class);
            }
        }else {
            ToastUtils.showShort(TelecomCardActivity.this, getResources().getString(R.string.shop_state_no));
        }
    }

    /**
     * 极光推送 店铺 冻结结果
     */
    @Subscriber(tag = Constant.BUS_JPUSH_SHOP_FROZEN_TAG)
    public void onJpushShopFrozenTag(String pushTag) {
        //设置新的 店铺冻结结果
        mACacheUser.setState(pushTag);
    }

    /**
     * 接收 支付密码已经设置成功的推送
     */
    @Subscriber(tag = Constant.BUS_PAY_SET_UP_PWD_YES)
    public void onPaySetUpPwdYes(final String payNewPwd) {
        //设置新的支付密码
        mACacheUser.setTsPwd(payNewPwd);
    }

    /**
     * 获取 iccid
     */
    @Subscriber(tag = Constant.BUS_HOME_ICCID_LIST)
    public void onIccidList(final List<Iccid> list) {

        //TODO 列表非空判断
        if (list != null && list.size() != 0) {
            //新建 list 数组，把详情名称提取出来
            final List<String> iccids = new ArrayList<>();
            //循环提取数据
            for (int i = 0; i < list.size(); i++) {
                iccids.add(list.get(i).getICCID());
            }
            //TODO 填充数据 到下拉列表中
            spinnerNumberIccid.setItems(iccids);

            if (iccids.size()>0)
                //设置 下拉列表最大高度
                spinnerNumberIccid.setDropdownMaxHeight(500);

            //获取 默认的 iccid
            mIccid = iccids.get(0);

            //TODO iccid 监听事件
            spinnerNumberIccid.setOnItemSelectedListener(new MaterialSpinner.OnItemSelectedListener<String>() {
                @Override
                public void onItemSelected(MaterialSpinner view, int position, long id, String item) {
                    //获取 第 i 个 号卡套餐 详情
                    mIccid = iccids.get(position);
                }
            });
        }
    }

    /**
     * 刷新 余额信息 信息
     */
    @Subscriber(tag = Constant.BUS_MY_REMAINDER)
    public void onMyRemainderPush(double money) {
        //TODO 更新 店铺实体 余额
        mACacheUser.setRemainder(money);
    }

    /**
     * 响应 提交 电话卡订单 ------> 电信、移动 出错
     */
    @Subscriber(tag = Constant.BUS_HOME_TELECOM_SUBMIT_ERROR)
    public void onTelecomSubmitError(String strError) {
        //延时 1s
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //销毁弹窗
                timeDialog.dismiss();
                //弹出提示
                ToastUtils.showShort(TelecomCardActivity.this, "网络连接不稳定，请稍后再试！");
            }
        }, 1000);
    }

    /**
     * 加载 提交 电话卡订单 ------> 电信、移动 返回结果
     */
    @Subscriber(tag = Constant.BUS_HOME_TELECOM_SUBMIT)
    public void onTelecomSubmit(final OrderState state) {
        //延时 1s
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //获取当前订单信息
                mOrderState = state;
                //销毁弹窗
                timeDialog.dismiss();
                //设置当前订单已经支付过了
                mOrderFlag = true;
                //返回值判断
                if (state.getState().equals("1")) {
                    //弹出支付软件盘
                    setShowPayPopupView("号卡订单支付", mOrderState.getPrice());
                }
                //弹出提示
                ToastUtils.showShort(TelecomCardActivity.this, state.getMsg());
            }
        }, 1000);
    }

    /**
     * 显示 支付视图弹窗
     */
    private void setShowPayPopupView(String title,double money) {

        //TODO 配置弹窗
        mPopPayPwd = new PopEnterPassword(TelecomCardActivity.this,title,money) {
            //输入支付密码完成后，所要进行的操作
            @Override
            public void setOnFinishInput(String pwd) {
                //弹出加载框
                initShowTimeDialog("正在验证支付密钥，请稍后....", TelecomCardActivity.this);
                //开始验证支付密码
                mApiUserManager.userCardCheckPayPwd(mACacheUser.getId(),pwd);
            }
        };

        /**
         * 显示 支付窗口
         * ps：设置 “Gravity” layout在PopupWindow中显示的位置
         */
        mPopPayPwd.showAtLocation(TelecomCardActivity.this.findViewById(R.id.layout_telecom_card),
                Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0);
    }

    /**
     * 验证支付 报错
     */
    @Subscriber(tag = Constant.BUS_MY_CARD_CHECK_PAY_ERROR, mode = ThreadMode.MAIN)
    public void initCheckPayError(String strError) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //销毁加载提示框
                timeDialog.dismiss();
                //弹出提示
                ToastUtils.showShort(TelecomCardActivity.this,"支付密钥验证失败，网络连接不稳定！");
            }
        }, 2000);
    }

    /**
     * 验证支付
     */
    @Subscriber(tag = Constant.BUS_MY_CARD_CHECK_PAY, mode = ThreadMode.MAIN)
    public void initCheckPay(final State state) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //TODO 判断当前是否验证成功
                if (state.getState().equals("1")){
                    //设置 支付标题
                    timeDialog.setContent("正在支付，请稍后...");
                    //开始支付网络请求
                    mApiUserManager.userCardPay(mACacheUser.getId(),mOrderState.getOrderId());
                }else{
                    //销毁加载提示框
                    timeDialog.dismiss();
                    //显示提示信息 dialog
                    new MaterialDialog.Builder(TelecomCardActivity.this)
                            .content("支付密码错误，请重试")
                            .negativeText("重试")
                            .negativeColor(Color.parseColor("#cccccc"))
                            .onNegative(new MaterialDialog.SingleButtonCallback() {
                                @Override
                                public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                                    //弹出支付软件盘
                                    setShowPayPopupView("号卡订单支付", mOrderState.getPrice());
                                }
                            })
                            .positiveText("忘记密码")
                            .onPositive(new MaterialDialog.SingleButtonCallback() {
                                @Override
                                public void onClick(MaterialDialog dialog, DialogAction which) {
                                    //跳转 忘记支付密码 页面
                                    JumperUtils.JumpTo(TelecomCardActivity.this, PayForgetPwdActivity.class);
                                }
                            }).show();
                }
            }
        }, 2000);
    }

    /**
     * 号卡订单 支付 报错
     */
    @Subscriber(tag = Constant.BUS_MY_CARD_ORDER_PAY_ERROR, mode = ThreadMode.MAIN)
    public void initCardPayError(String httpInstallError) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //销毁加载弹窗
                timeDialog.dismiss();
                //弹出提示
                ToastUtils.showShort(TelecomCardActivity.this,"支付失败，网络连接不稳定！");
            }
        }, 2000);
    }

    /**
     * 号卡订单 支付 数据返回
     */
    @Subscriber(tag = Constant.BUS_MY_CARD_ORDER_PAY, mode = ThreadMode.MAIN)
    public void initCardPay(final OrderPayState bean) {
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                //销毁加载弹窗
                timeDialog.dismiss();
                //TODO 支付结果判断
                switch (bean.getState()){

                    //支付成功
                    case "1":
                        //保存新的 用户余额参数
                        mACacheUser.setRemainder(bean.getRemainder());
                        mACache.put(Constant.CACHE_USER, new Gson().toJson(mACacheUser));
                        //更新我的页面 余额
                        EventBus.getDefault().post(bean.getRemainder(),Constant.BUS_MY_REMAINDER);
                        //显示提示信息 dialog
                        initShowMsgDialog();
                        break;
                    //余额不足
                    case "2":
                        break;
                }
                //消息提示
                ToastUtils.showShort(TelecomCardActivity.this,bean.getMsg());
            }
        }, 2000);
    }

    /**
     * 显示提示dialog
     */
    public void initShowMsgDialog() {
        //显示提示信息 dialog
        MaterialDialog dialog = new MaterialDialog.Builder(TelecomCardActivity.this)
                .title("支付成功")
                .content("订单支付成功，可在我的订单查看详情！")
                .positiveText("我知道了")
                .onPositive(new MaterialDialog.SingleButtonCallback() {
                    @Override
                    public void onClick(MaterialDialog dialog, DialogAction which) {
                        //更新号卡页面数据
                        EventBus.getDefault().post("pushSale", Constant.BUS_SALE_PUSH_UI);
                        //退出当前页面
                        finish();
                    }
                }).show();
        // 设置点击屏幕Dialog不消失
        dialog.setCanceledOnTouchOutside(false);
        //取消Back键监听
        dialog.setCancelable(false);
    }
}
